热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基准|数目_requireJS学习笔记

篇首语:本文由编程笔记#小编为大家整理,主要介绍了requireJS学习笔记相关的知识,希望对你有一定的参考价值。AM

篇首语:本文由编程笔记#小编为大家整理,主要介绍了requireJS学习笔记相关的知识,希望对你有一定的参考价值。



AMD、CMD与commonJS

requireJS实现了AMD规范,即异步加载模块,模块加载的时候不会阻塞后续代码的执行,将模块加载完后的操作(依赖该模块的程序)放到回调函数中进行。这种规范适合于浏览器端。例如:

require(['module1', 'module2'], function(mod1, mod2)
//do something; //当module1/2加载完后会执行该回调。加载时不阻塞require后面的代码
);

而(node服务端采用的是commonJS规范,commonJS是同步的,因为文件就存在于服务器,require进来的时候比较快)。例如:

var module = require ('module');
module.func();

一个文件就是一个模块,通过module.exportsexports 对象来导出模块内的方法、属性,方便外部模块引用。

requireJS不光实现了异步加载,避免页面假死,同时还管理了模块间的依赖,使得代码更容易维护。

而AMD也是异步加载的规范,与AMD不同的是,AMD推崇依赖前置,即提前加载好依赖的模块,而CMD推崇依赖就近加载(延后执行依赖模块,as lazy as possible),要用的时候才加载。二者的主要区别就是所依赖的模块的执行时机不同(依赖的加载怎么异步的?)。
例如:


  • AMD:

define(['a', 'b'], function(a, b) //当依赖的模块加载完成执行定义函数
a.func(); //a、b模块提前加载好
b.func();
return
...
;
);

如果有代码加载上面定义的模块,则会先加载[] 中所依赖的模块。
- CMD:

define(function(require, exports, module)
var a = require('a');
a.func();
...
var b = require('b');
b.func();
);

为了加载commonJS规范的模块,应该使用和CMD类似的加载依赖方式(无法通过数组参数加载依赖):

define(function(require, exports, module)
var a = require('a'),
b = require('b');
//Return the module value
return function () ;

);

此外,如果依赖是相对路径,要讲require 作为依赖添加到依赖参数:

define(["require", "./relative/name"], function(require)
var mod = require("./relative/name");
);

因此,最好的方式就是直接使用上面的commonJS的方式(simplified CommonJS wrapping,requirejs对这种包装会解析成AMD的模式)。


requireJS的使用

requireJS使用ModuleId来替代文件路径。moduleId 是有baseUrlpaths 来设置的。
由于浏览器是不识别requiredefine 等的。因此需要在页面加载文件require.js 。此外,还可以对模块的基准路径、路径、不遵循AMD规范的模块进行配置。
有两种方式,一种是调用require.config() 方法:

require.config(
baseUrl: 'js',
paths:
'module1': 'lib/module1',
...
,
shim:
'lib/jquery.validate': ['jquery'],
...

);

显然需要在require.js 文件引入之后才能调用该方法。
一种是定义一个require 全局对象:

var require =
//内容同上
;

该对象需要在require.js 文件引入之前进行定义。


requireJS实现机制



RequireJS使用head.appendChild()将每一个依赖加载为一个script标签。
RequireJS等待所有的依赖加载完毕,计算出模块定义函数正确调用顺序,然后依次调用它们。


问题: 动态生成的script标签?控制加载顺序就是生成标签的顺序,利用script标签加载好后出发load事件?

项目中提前定义require 为收集函数来收集页面中出现的require 方法,并放到页面结尾处再执行。不过使用配置文件中再次声明一个require对象覆盖了前面定义的收集函数。

参考:
requireJS中文文档


requireJS中的r.js

由于一个模块是一个JS文件(生成script 标签插入到head),加载多个模块的时候会增加请求数目。requireJS提供了一个工具即r.js来进行JS文件的合并。
定义一个模块的时候指定依赖可以使用这种方式:

//test.js
define(['jquery', 'common'], function($, common)
// do something
return
;
);

或者采用兼容commonJS语法的方式:

define(function(require,[exports, module])
var $ = require('jquery');
var common = require('common');
// do something
return
;
);

还有当以字符串数组例如require(['']) 的形式加载模块时。以上方式在r.js在进行合并时,默认会将定义的模块及其依赖的诸如jquery、common等模块合并到一个JS文件中,除非你在build.js配置文件中指定要exclude哪些文件,这样就不会合并指定的文件了。另外也可以使用include来动态指定要包括哪些文件,这样可以添加在静态分析的时候没有合并的文件。合并的时候会把直接依赖、以及依赖的依赖…均合并到一个文件中。

html中的引入:

require(['common'], function()
require(['test'], function(module)
//do something
);
);

并不是说test依赖于common,而是指定加载顺序,必须是common加载完后才能加载test。该处与模块的合并打包没有关系,仅仅指定加载顺序。模块的合并打包只与在定义模块的时候有无依赖以及build.js中的include和exclude有关。
common中包含了一些公用的文件,可以缓存。

如果A依赖B,B依赖C,在没有做exclude的时候A中会包含B、C以及A自身的模块内容。

如果A依赖B、C,B依赖C,A把B exclude了,那么也会默认把C也exclude掉。即exclude的时候会把依赖以及依赖的依赖。。。中的也排除掉,即便自身显示地依赖了‘依赖的依赖’中某个模块。

includeexclude 的解释,官方的说明比较清晰:

参考:r.js/build/example.build.js

问题:当将公用模块打包到一个文件后,别的文件要加载其中的某个模块的时候是怎么加载进来的?


推荐阅读
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
author-avatar
蓝色水气球_453
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有